package model

import (
	"errors"
	"strings"
)

// config配置
type Config struct {
	GameType    string `json:"gameType" yaml:"gameType" `      // 游戏类型[CAG,RPG,SLG,CAG,MOBA,...]
	GameId      int    `json:"gameId" yaml:"gameId"`           // 游戏id
	Secret      string `json:"secret" yaml:"secret"`           // 游戏id的秘钥
	Url         string `json:"url" yaml:"url"`                 // 数据上报接口地址
	Timeout     int    `json:"timeout" yaml:"timeout"`         // 接口请求timeout 秒级时间
	LogLevel    string `json:"logLevel" yaml:"logLevel"`       // 日志level级别,默认info
	CronSpec    string `json:"cronSpec" yaml:"cronSpec"`       // 定时上报数据的crontab描述符, 默认"0/5 * * * * ?"
	MaxSize     int    `json:"maxSize" yaml:"maxSize"`         // 批量数据上报的最大条数, 1为单条
	MaxQueue    int    `json:"maxQueue" yaml:"maxQueue"`       // 数据队列缓存长度
	MaxConsumer int    `json:"maxConsumer" yaml:"maxConsumer"` // 最大消费者数量,上报数据的消费者数量
	Compression string `json:"compression" yaml:"compression"` // 压缩算法,暂时不支持,请填写None
	Timezone    string `json:"timezone" yaml:"timezone"`       // 时区
}

func (c *Config) Normalize() error {
	if err := c.UpperGameType(); err != nil {
		return err
	}
	// check GameId
	if c.GameId <= 0 {
		return errors.New("property [GameId] can't <= 0")
	}
	if c.Secret == "" || len(c.Secret) == 0 {
		return errors.New("property [Secret] can't be empty")
	}
	if c.Timeout <= 0 {
		return errors.New("property [Timeout] should > 0")
	}
	if c.MaxSize <= 0 {
		return errors.New("property [MaxSize] should > 0")
	}
	if c.MaxQueue < 0 {
		return errors.New("property [MaxSize] should >= 0")
	}
	if c.MaxConsumer <= 0 {
		return errors.New("property [MaxConsumer] should > 0")
	}
	return nil
}

func (c *Config) UpperGameType() (err error) {
	c.GameType = strings.ToUpper(c.GameType)
	// fmt.Println("upperGameType:", c.GameType)
	switch c.GameType {
	case "CAG":
	case "CCG":
	case "RPG":
	case "SLG":
	case "ACT":
	case "AVG":
	case "PUZ":
	case "MOBA":
	case "RAC":
	case "RTS":
	case "TBG":
	case "MSC":
	case "SPG":
	default:
		err = errors.New("property [GameType] is invalid, Please choose " +
			"[CAG,CCG,RPG,SLG,ACT,AVG,PUZ,MOBA,RAC,RTS,TBG,MSC,SPG]")
	}
	return
}
